<?php
/**
 * Service_Sorting
 *
 * Класс для обработки сортировочных значений
 *
 * @author Александр Егоров <slamer86@gmail.ru>
 * @version 1.1
 */
class Service_Sorting {

	/**
	 * Пересортировка
	 * $rootId - id Ветки(id родителя)
	 * $essenceId - id сущности, которая была перенесена
	 * $newSortNum - новое положение
	 * $essenceType - тип сущности
	 * $rootField - имя рутового поля
	 */
	public static function moveAfterSortLine($rootId, $essenceId, $newSortNum, $essenceType, $pkName, $rootField){
		$essence = Service_Essence::getEssenceTypeName($essenceType);
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `" . $essence . "`.`" . $pkName . "`, `" . $essence . "`.`sort_num`
		FROM `" . $essence . "`
		WHERE `" . $essence . "`.`" . $rootField . "` " . (!empty($rootId) ? " = " . $rootId : "IS NULL ") . "
		ORDER BY `sort_num`";
		$arrOld = $objDB->select($stmt);
		foreach ($arrOld as $arr) {
			$arrSortById[$arr[$pkName]] = $arr;
		}
		$size = sizeof($arrOld);
		$arrNew = array();
		for ($num = 0; $num < $size; $num++) {
			if (sizeof($arrNew) == $newSortNum)	$arrNew[] = $arrSortById[$essenceId];
			if ($arrOld[$num][$pkName] != $essenceId) $arrNew[] = $arrOld[$num];
		}
		if ($size > sizeof($arrNew)) $arrNew[] = $arrSortById[$essenceId];
		$str = '';
		for ($num = 0; $num < $size; $num++) {
			$str .= " WHEN " . $arrNew[$num][$pkName] . " then " . $num;
			$arrSimple[] = $arrNew[$num][$pkName];
		}
		$stmt = "
		UPDATE `" . $essence . "`
		SET `sort_num` = CASE `" . $pkName . "` " . $str . " END
		WHERE `" . $pkName . "` in(" . join(", ", $arrSimple) . ")";
		$objDB->query($stmt);
	}

}